Преобразует вариант из одного типа в другой.
HRESULT VariantChangeType ( VARIANTARG FAR* pvargDest, VARIANTARG FAR* pvarSrc, unsigned short wFlags, VARTYPE vt );
Параметры
pvargDest
Указатель на VARIANTARG, принимающий
результаты приведения типа. Если это тот же указатель, что и pvarSrc, то
вариант преобразуется по месту.
pvarSrc
Указатель на исходный
VARIANTARG, который нужно привести к новому
типу.
wFlags
Флаги, управляющие преобразованием. В настоящий момент
определен единственный флаг — VARIANT_NOVALUEPROP, который запрещает
функции пытаться преобразовывать объект к базовому типу данных, обращаясь к
свойству Value. Приложениям следует устанавливать этот флаг только при
необходимости, так как после этого их поведение будет отличаться от поведения
других приложений.
vt
Целевой тип преобразования. Если функция
возвращает код S_OK, то поле vt в *pvargDest всегда равно
данному значению.
Коды возврата
Из возвращенного HRESULT получают один из следующих
кодов возврата:
Код возврата | Значение |
S_OK | Успех. |
DISP_E_BADVARTYPE | vt - недопустимый тип варианта. |
DISP_E_OVERFLOW | Значение, на которое указывает pvarSrc, не умещается в диапазон целевого типа. |
DISP_E_TYPEMISMATCH | Аргумент нельзя привести к заданному типу. |
E_INVALIDARG | Один из аргументов неверен. |
E_OUTOFMEMORY | He хватает памяти для преобразования. |
Комментарии
Функция VariantChangeType выполняет преобразование
между базовыми типами (включая преобразования из числа в строку и из строки в
число). Вариант, в котором установлен флаг VT_BYREF, преобразуется к
значению путем получения значения, на которое он ссылается. Объект приводится к
значению путем обращения к свойству Value (DISPID_VALUE).
Обычно
реализация IDispatch::Invoke определяет, к какому члену выполняется
обращение, и затем вызывает VariantChangeType, чтобы получить значение
одного или нескольких аргументов. Например, если вызов IDispatch задает
член SetTitle, который принимает один строковый аргумент, то реализация
вызывает VariantChangeType, пытаясь преобразовать параметр в строку. Если
VariantChangeType не возвращает ошибку, то значение аргумента можно
считать непосредственно из поля bstrVal структуры VARIANTARG. Если
VariantChangeType возвращает DISP_E_TYPEMISMATCH, то реализация
должна установить *puArgErr в 0 (указывая аргумент, вызвавший ошибку) и
возвратить из IDispatch::Invoke DISP_E_TYPEMISMATCH.
Данная функция не
преобразует массив одного типа в массив другого типа.
Примечание. Тип
VARIANTARG не следует преобразовывать «по месту» в массиве
rgvarg.